﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BE_CruzDelSur;
using System.Data.SqlClient;
using System.Data;
using BR_CruzDelSur.Interfaces;

namespace BR_CruzDelSur
{
    public class BR_ProgramacionRuta : IBR_ProgramacionRuta
    {
        Conexion conn = new Conexion();
        const string CONST_ESTADO_ACTIVO_PROGRAMACION_RUTA = "1";

        public BE_ProgramacionRuta f_InsertarProgramacionRuta(int rutaId,
            DateTime fechaPartida,
            DateTime fechaLlegada,
            int conductorPrincipalId,
            int conductorReemplazoId,
            int vehiculoId,
            string observaciones)
        {
            SqlParameter[] param = new SqlParameter[9];
            param[0] = new SqlParameter("INT_RUTA", SqlDbType.Int);
            param[0].Value = rutaId;
            param[0].Direction = ParameterDirection.Input;
            param[1] = new SqlParameter("DTM_FECHA_PARTIDA", SqlDbType.DateTime);
            param[1].Value = fechaPartida;
            param[1].Direction = ParameterDirection.Input;
            param[2] = new SqlParameter("DTM_FECHA_LLEGADA", SqlDbType.DateTime);
            param[2].Value = fechaLlegada;
            param[2].Direction = ParameterDirection.Input;
            param[3] = new SqlParameter("INT_CONDUCTOR_PRINCIPAL", SqlDbType.Int);
            param[3].Value = conductorPrincipalId;
            param[3].Direction = ParameterDirection.Input;
            param[4] = new SqlParameter("INT_CONDUCTOR_REEMPLAZO", SqlDbType.Int);
            param[4].Value = conductorReemplazoId;
            param[4].Direction = ParameterDirection.Input;
            param[5] = new SqlParameter("INT_VEHICULO", SqlDbType.Int);
            param[5].Value = vehiculoId;
            param[5].Direction = ParameterDirection.Input;
            param[6] = new SqlParameter("VCH_OBSERVACIONES", SqlDbType.VarChar);
            param[6].Value = observaciones;
            param[6].Direction = ParameterDirection.Input;
            param[7] = new SqlParameter("CHR_ESTADO", SqlDbType.Char);
            param[7].Value = CONST_ESTADO_ACTIVO_PROGRAMACION_RUTA;
            param[7].Direction = ParameterDirection.Input;

            param[8] = new SqlParameter("INT_CODIGO_PROGRAMACION_RUTA", SqlDbType.Int);
            param[8].Direction = ParameterDirection.Output;

            BE_ProgramacionRuta entidad = null;
            try
            {
                int result = SqlHelper.ExecuteNonQuery(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_INSERTARPROGRAMACIONRUTA", param);

                entidad = new BE_ProgramacionRuta()
                {
                    FechaOrigen = fechaPartida.ToString("dd/MM/yyyy HH:mm"),
                    FechaDestino = fechaLlegada.ToString("dd/MM/yyyy HH:mm"),
                    IDRutaProgramada = Convert.ToInt32(param[8].Value.ToString()),
                    IDRuta = rutaId,
                    IDVehiculo = vehiculoId,
                    IDConductorPrincipal = conductorPrincipalId,
                    IDConductorReemplazo = conductorReemplazoId,
                    Observaciones = observaciones,
                    Estado = CONST_ESTADO_ACTIVO_PROGRAMACION_RUTA
                };               
            }
            catch (Exception ex)
            {
                //HelperLog h = new HelperLog();
                //h.GuardarError(ex);
                //HelperLog.GuardarError(ex);
                IClienteLog log = new LogAdapter();
                entidad = new BE_ProgramacionRuta();
                entidad.MensajeError = log.GuardarErrorLog(ex.Message, "3");               
            }

            return entidad;
        }

        public BE_ProgramacionRuta f_ActualizarProgramacionRuta(int programacionRutaId, 
            int rutaId,
            DateTime fechaPartida,
            DateTime fechaLlegada,
            int conductorPrincipalId,
            int conductorReemplazoId,
            int vehiculoId,
            string observaciones)
        {
            SqlParameter[] param = new SqlParameter[8];
            param[0] = new SqlParameter("INT_RUTA", SqlDbType.Int);
            param[0].Value = rutaId;
            param[0].Direction = ParameterDirection.Input;
            param[1] = new SqlParameter("DTM_FECHA_PARTIDA", SqlDbType.DateTime);
            param[1].Value = fechaPartida;
            param[1].Direction = ParameterDirection.Input;
            param[2] = new SqlParameter("DTM_FECHA_LLEGADA", SqlDbType.DateTime);
            param[2].Value = fechaLlegada;
            param[2].Direction = ParameterDirection.Input;
            param[3] = new SqlParameter("INT_CONDUCTOR_PRINCIPAL", SqlDbType.Int);
            param[3].Value = conductorPrincipalId;
            param[3].Direction = ParameterDirection.Input;
            param[4] = new SqlParameter("INT_CONDUCTOR_REEMPLAZO", SqlDbType.Int);
            param[4].Value = conductorReemplazoId;
            param[4].Direction = ParameterDirection.Input;
            param[5] = new SqlParameter("INT_VEHICULO", SqlDbType.Int);
            param[5].Value = vehiculoId;
            param[5].Direction = ParameterDirection.Input;
            param[6] = new SqlParameter("VCH_OBSERVACIONES", SqlDbType.VarChar);
            param[6].Value = observaciones;
            param[6].Direction = ParameterDirection.Input;
            //param[7] = new SqlParameter("CHR_ESTADO", SqlDbType.Char);
            //param[7].Value = CONST_ESTADO_ACTIVO_PROGRAMACION_RUTA;
            //param[7].Direction = ParameterDirection.Input;
            param[7] = new SqlParameter("INT_CODIGO_PROGRAMACION_RUTA", SqlDbType.Int);
            param[7].Value = programacionRutaId;
            param[7].Direction = ParameterDirection.Input;

            BE_ProgramacionRuta entidad = null;
            try
            {
                int result = SqlHelper.ExecuteNonQuery(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_ACTUALIZARPROGRAMACIONRUTA", param);

                entidad = new BE_ProgramacionRuta()
                {
                    IDRutaProgramada = programacionRutaId,
                    FechaOrigen = fechaPartida.ToString("dd/MM/yyyy HH:mm"),
                    FechaDestino = fechaLlegada.ToString("dd/MM/yyyy HH:mm"),
                    IDRuta = rutaId,
                    IDVehiculo = vehiculoId,                    
                    IDConductorPrincipal = conductorPrincipalId,
                    IDConductorReemplazo = conductorReemplazoId,
                    Observaciones = observaciones,
                    Estado = CONST_ESTADO_ACTIVO_PROGRAMACION_RUTA
                };                
            }
            catch (Exception ex)
            {
                IClienteLog log = new LogAdapter();
                entidad = new BE_ProgramacionRuta();
                entidad.MensajeError = log.GuardarErrorLog(ex.Message, "3");                             
            }

            return entidad;
        }

        public bool f_EliminarProgramacionRuta(int codigoProgramacionRuta)
        {
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("INT_CODIGO_PROGRAMACION_RUTA", SqlDbType.Int);
            param[0].Value = codigoProgramacionRuta;
            param[0].Direction = ParameterDirection.Input;

            bool entidad = true;
            try
            {
                int result = SqlHelper.ExecuteNonQuery(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_ELIMINARPROGRAMACIONRUTA", param);
            }
            catch (Exception ex)
            {
                entidad = false;

                
            }

            return entidad;
        }

        public bool f_ActualizarEstadoProgramacionRuta(int codigoProgramacionRuta, string estado)
        {
            SqlParameter[] param = new SqlParameter[2];
            param[0] = new SqlParameter("INT_CODIGO_PROGRAMACION_RUTA", SqlDbType.Int);
            param[0].Value = codigoProgramacionRuta;
            param[0].Direction = ParameterDirection.Input;
            param[1] = new SqlParameter("CHR_ESTADO", SqlDbType.Char);
            param[1].Value = estado;
            param[1].Direction = ParameterDirection.Input;

            bool entidad = true;
            try
            {
                int result = SqlHelper.ExecuteNonQuery(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_CAMBIARESTADOPROGRAMACIONRUTA", param);

            }
            catch (Exception ex)
            {
                entidad = false;
            }

            return entidad;
        }


        public int f_BuscaProgramacionRutaConCarga(int CodigoProgramacionRuta)
        {
            List<BE_ProgramacionRuta> lst = new List<BE_ProgramacionRuta>();
            SqlParameter[] param = new SqlParameter[2];
            param[0] = new SqlParameter("INT_CODIGO_PROGRAMACION_RUTA", SqlDbType.Int);
            param[0].Value = CodigoProgramacionRuta;
            param[0].Direction = ParameterDirection.Input;
            param[1] = new SqlParameter("INT_EXISTEN_CARGAS", SqlDbType.Int);
            param[1].Direction = ParameterDirection.Output;

            try
            {
                SqlHelper.ExecuteNonQuery(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_BUSCAPROGRAMACIONRUTACONCARGA", param);
                return Convert.ToInt16(param[1].Value);
            }
            catch (Exception ex)
            {
                return -1;
            }
        }

        public List<BE_ProgramacionRuta> f_BuscaProgramacionXDepartamento(int codigoOrigen, int codigoDestino)
        {
            List<BE_ProgramacionRuta> lst = new List<BE_ProgramacionRuta>();
            SqlParameter[] param = new SqlParameter[2];
            param[0] = new SqlParameter("INT_CODIGO_UBIGEO_ORIGEN", SqlDbType.Int);
            param[0].Value = codigoOrigen;
            param[0].Direction = ParameterDirection.Input;
            param[1] = new SqlParameter("INT_CODIGO_UBIGEO_DESTINO", SqlDbType.Int);
            param[1].Value = codigoDestino;
            param[1].Direction = ParameterDirection.Input;

            DataSet ds = SqlHelper.ExecuteDataSet(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_BUSCAPROGRAMACIONRUTAXDEPARTAMENTO", param);

            foreach (DataRow item in ds.Tables[0].Rows)
            {
                lst.Add(new BE_ProgramacionRuta() { 
                    FechaOrigen = Convert.ToDateTime(item["DTM_FECHA_ORIGEN"].ToString()).ToString("dd/MM/yyyy HH:mm"),
                    FechaDestino = Convert.ToDateTime(item["DTM_FECHA_DESTINO"].ToString()).ToString("dd/MM/yyyy HH:mm"),
                    NombreAgencia = item["VCH_AGENCIA"].ToString(),
                    DireccionAgencia = item["VCH_DIRECCION_AGENCIA"].ToString(),
                    TipoServicio = item["VCH_TIPO_SERVICIO"].ToString(),
                    TipoTransporte = item["VCH_TIPO_TRANSPORTE"].ToString(),
                    IDRutaProgramada = Convert.ToInt32(item["INT_CODIGO_PROGRAMACION_RUTA"].ToString())
                });                
            }

            return lst;
        }

        public List<BE_ProgramacionRuta> f_ListaProgramacionRutas(int codigoOrigen, string dni, string fProgramacion)
        {
            List<BE_ProgramacionRuta> lst = new List<BE_ProgramacionRuta>();
            SqlParameter[] param = new SqlParameter[3];
            param[0] = new SqlParameter("INT_CODIGO_UBIGEO_ORIGEN", SqlDbType.Int);
            param[0].Value = codigoOrigen;
            param[0].Direction = ParameterDirection.Input;
            param[1] = new SqlParameter("VCH_DNI_CONDUCTOR", SqlDbType.VarChar);
            param[1].Value = dni;
            param[1].Direction = ParameterDirection.Input;
            param[2] = new SqlParameter("VCH_FECHA_PROGRAMACION_RUTA", SqlDbType.VarChar);
            param[2].Value = fProgramacion;
            param[2].Direction = ParameterDirection.Input;

            DataSet ds = SqlHelper.ExecuteDataSet(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_LISTAPROGRAMACIONRUTAS", param);

            foreach (DataRow item in ds.Tables[0].Rows)
            {
                lst.Add(new BE_ProgramacionRuta()
                {
                    FechaOrigen = Convert.ToDateTime(item["DTM_FECHA_ORIGEN"].ToString()).ToString("dd/MM/yyyy HH:mm"),
                    FechaDestino = Convert.ToDateTime(item["DTM_FECHA_DESTINO"].ToString()).ToString("dd/MM/yyyy HH:mm"),
                    NombreAgencia = item["VCH_AGENCIA"].ToString(),
                    DireccionAgencia = item["VCH_DIRECCION_AGENCIA"].ToString(),
                    TipoServicio = item["VCH_TIPO_SERVICIO"].ToString(),
                    TipoTransporte = item["VCH_TIPO_TRANSPORTE"].ToString(),
                    IDRutaProgramada = Convert.ToInt32(item["INT_CODIGO_PROGRAMACION_RUTA"].ToString()),
                    Origen = item["VCH_ORIGEN"].ToString(),
                    Destino = item["VCH_DESTINO"].ToString(),
                    Estado = (item["CHR_ESTADO"].ToString() == "1" ? "ACTIVO" : "INACTIVO")                     
                });
            }

            return lst;
        }

        public List<BE_ProgramacionRuta> f_BuscaProgramacionParaGuia(int Codigo)
        {
            List<BE_ProgramacionRuta> lst = new List<BE_ProgramacionRuta>();
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("INT_CODIGO_RUTA_PROGRAMADA", SqlDbType.Int);
            param[0].Value = Codigo;
            param[0].Direction = ParameterDirection.Input;

            try
            {
                DataSet ds = SqlHelper.ExecuteDataSet(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_BUSCARPROGRAMACIONRUTA", param);

                foreach (DataRow item in ds.Tables[0].Rows)
                {
                    lst.Add(new BE_ProgramacionRuta()
                    {
                        FechaOrigen = Convert.ToDateTime(item["DTM_FECHA_ORIGEN"].ToString()).ToString("dd/MM/yyyy HH:mm"),
                        FechaDestino = Convert.ToDateTime(item["DTM_FECHA_DESTINO"].ToString()).ToString("dd/MM/yyyy HH:mm"),
                        NombreAgencia = item["ORIGEN"].ToString(),
                        DireccionAgencia = item["DIRECCIONORIGEN"].ToString(),
                        NombreAgenciaDestino = item["DESTINO"].ToString(),
                        DireccionAgenciaDestino = item["DIRECCIONDESTINO"].ToString(),
                        LicenciaConducir = item["VCH_LICENCIA_CONDUCIR"].ToString(),
                        PlacaBus = item["VCH_PLACA"].ToString(),
                        IDRutaProgramada = Convert.ToInt32(item["INT_CODIGO_PROGRAMACION_RUTA"].ToString()),                        
                    });
                }
            }
            catch (Exception ex)
            { 
            }

            return lst;
        }

        public BE_ProgramacionRuta f_BuscaProgramacionXCodigo(int Codigo) {

            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("INT_CODIGO_PROGRAMACIONRUTA", SqlDbType.Int);
            param[0].Value = Codigo;
            param[0].Direction = ParameterDirection.Input;

            try
            {
                DataSet ds = SqlHelper.ExecuteDataSet(conn.CadenaConexion, System.Data.CommandType.StoredProcedure, "SP_BUSCAPROGRAMACIONRUTAXCODIGO", param);

                foreach (DataRow item in ds.Tables[0].Rows)
                {
                    return new BE_ProgramacionRuta()
                    {
                        FechaOrigen = Convert.ToDateTime(item["DTM_FECHA_ORIGEN"].ToString()).ToString("dd/MM/yyyy"),
                        FechaDestino = Convert.ToDateTime(item["DTM_FECHA_DESTINO"].ToString()).ToString("dd/MM/yyyy"),
                        HoraOrigen = Convert.ToDateTime(item["DTM_FECHA_ORIGEN"].ToString()).ToString("HH:mm"),
                        HoraDestino = Convert.ToDateTime(item["DTM_FECHA_DESTINO"].ToString()).ToString("HH:mm"),
                        NombreAgencia = item["VCH_AGENCIA"].ToString(),
                        DireccionAgencia = item["VCH_DIRECCION_AGENCIA"].ToString(),
                        TipoServicio = item["VCH_TIPO_SERVICIO"].ToString(),
                        TipoTransporte = item["VCH_TIPO_TRANSPORTE"].ToString(),
                        IDRutaProgramada = Convert.ToInt32(item["INT_CODIGO_PROGRAMACION_RUTA"].ToString()),
                        IDRuta = Convert.ToInt32(item["INT_CODIGO_RUTA"].ToString()),
                        IDConductorPrincipal = Convert.ToInt32(item["INT_CONDUCTOR"].ToString()),
                        IDConductorReemplazo = Convert.ToInt32(item["INT_CONDUCTOR_REEMPLAZO"].ToString()),
                        IDVehiculo = Convert.ToInt32(item["INT_VEHICULO"].ToString()),
                        Observaciones = item["VCH_OBSERVACIONES"].ToString(),
                        Estado = (item["CHR_ESTADO"].ToString() == "1" ? "ACTIVO" : "INACTIVO")
                    };
                }
            }
            catch (Exception ex)
            {                
            }

            return null;
        }
    }
}
